﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluorineFx;
using System.Data;
using System.Collections.ObjectModel;

namespace CasasJusticia.Messaging.Contexto.CasasJusticia
{
    [RemotingService("Departamento")]
    public class Departamento
    {
        #region Constructor

        public Departamento()
        {
        }

        #endregion

        #region Procedimientos y Funciones

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>        
        /// <param name="idEntidad"></param>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        public string ConsultarCasasJusticia(string idDepartamento, int idEntidad, Array idCasasJusticia)
        {
            try
            {
                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                if (idEntidad < 0)
                {
                    var queryEntidadesPorCasasJusticia = (from entidadPorCasa in entidadesPorCasasJusticia
                                                          where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                                          && entidadPorCasa.IdDepartamento.Equals(idDepartamento)
                                                          select entidadPorCasa.IdCasaJusticia).Distinct().ToList();

                    return Utilidades.ArmarCadenaValoresList(queryEntidadesPorCasasJusticia);
                }
                else
                {
                    var queryEntidadesPorCasasJusticia = (from entidadPorCasa in entidadesPorCasasJusticia
                                                          where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                                          && entidadPorCasa.IdDepartamento.Equals(idDepartamento)
                                                          && entidadPorCasa.IdEntidad == idEntidad
                                                          select entidadPorCasa.IdCasaJusticia).Distinct().ToList();

                    return Utilidades.ArmarCadenaValoresList(queryEntidadesPorCasasJusticia);
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.Departamento")]
        public DataTable ConsultarDepartamentos(Array idCasasJusticia)
        {
            try
            {
                /*if (idCasasJusticia == null)
                    return null;
                if (idCasasJusticia.Length <= 0)
                    return null;
                string codigos = string.Join(",", idCasasJusticia.Cast<string>().ToArray());                
                string sql = string.Format(this._consultaDepartamentosPorIdsCasasJusticia, codigos);

                Consulta consulta = new Consulta();

                DataTable resultado = consulta.Ejecutar(sql);
                return resultado;*/

                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                var queryDepartamentos = from entidadPorCasa in entidadesPorCasasJusticia
                                         where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                         group entidadPorCasa by new { IdDepartamento = entidadPorCasa.IdDepartamento, NomDepartamento = entidadPorCasa.NomDepartamento } into dpto
                                         orderby dpto.Key.NomDepartamento
                                         select new Jurisdicciones.Departamento
                                         {
                                             IdDepartamento = dpto.Key.IdDepartamento,
                                             NomDepartamento = dpto.Key.NomDepartamento                                                         
                                         };

                return Utilidades.ConsultaToDataTable<Jurisdicciones.Departamento>(queryDepartamentos.ToArray());
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idDepartamento"></param>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.EntidadPorCasaGeo")]
        public DataTable ConsultarEntidades(string idDepartamento, Array idCasasJusticia)
        {
            try
            {
                /*if (idCasasJusticia == null)
                    return null;
                if (idCasasJusticia.Length <= 0)
                    return null;
                string codigos = string.Join(",", idCasasJusticia.Cast<string>().ToArray());
                string sql = string.Format(this._consultaEntidadesPorIdsCasasJusticia, codigos, idDepartamento);

                Consulta consulta = new Consulta();

                DataTable resultado = consulta.Ejecutar(sql);
                return resultado;*/

                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                var queryEntidadesPorCasasJusticia = from entidadPorCasa in entidadesPorCasasJusticia
                                                     where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia) && entidadPorCasa.IdDepartamento.Equals(idDepartamento)
                                                     group entidadPorCasa by new { IdEntidad = entidadPorCasa.IdEntidad, NomEntidad = entidadPorCasa.NomEntidad } into entidad
                                                     orderby entidad.Key.NomEntidad
                                                     select new EntidadPorCasa
                                                     {
                                                         EstEntidad = entidad.FirstOrDefault().EstEntidad,
                                                         EstEntidadCasa = entidad.FirstOrDefault().EstEntidadCasa,
                                                         IdCasaJusticia = entidad.FirstOrDefault().IdCasaJusticia,
                                                         IdDepartamento = entidad.FirstOrDefault().IdDepartamento,
                                                         IdEntidad = entidad.Key.IdEntidad,
                                                         IdEntidadCasa = entidad.FirstOrDefault().IdEntidadCasa,
                                                         IdLocalidad = entidad.FirstOrDefault().IdLocalidad,
                                                         IdMunicipio = entidad.FirstOrDefault().IdMunicipio,
                                                         NomCasaJusticia = entidad.FirstOrDefault().NomCasaJusticia,
                                                         NomDepartamento = entidad.FirstOrDefault().NomDepartamento,
                                                         NomEntidad = entidad.Key.NomEntidad,
                                                         NomLocalidad = entidad.FirstOrDefault().NomLocalidad,
                                                         NomMunicipio = entidad.FirstOrDefault().NomMunicipio,
                                                         TieneLocalidades = entidad.FirstOrDefault().TieneLocalidades,
                                                         TipoCasaJusticia = entidad.FirstOrDefault().TipoCasaJusticia
                                                     };

                return Utilidades.ConsultaToDataTable<EntidadPorCasa>(queryEntidadesPorCasasJusticia.ToArray());
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idCasasJusticia"></param>
        /// <returns></returns>
        [DataTableType("CasasJusticia.Modelo.EntidadPorCasaGeo")]
        public DataTable TotalCasasJusticia(Array idCasasJusticia)
        {
            try
            {
                if (idCasasJusticia.Length == 0)
                    throw new Exception("No se encontraron casas de justicia");

                Collection<EntidadPorCasa> entidadesPorCasasJusticia = Utilidades.EntidadesPorCasa();

                List<int> codigosCasasJusticia = Utilidades.ArmarListaValoresDeArray(idCasasJusticia);

                var queryCasasJusticiaPorDpto = from entidadPorCasa in entidadesPorCasasJusticia
                                                where codigosCasasJusticia.Contains(entidadPorCasa.IdCasaJusticia)
                                                group entidadPorCasa by new { IdDepartamento = entidadPorCasa.IdDepartamento, NomDepartamento = entidadPorCasa.NomDepartamento } into dpto
                                                select new CjDepartamento
                                                {
                                                    IdDepartamento = dpto.FirstOrDefault().IdDepartamento,
                                                    NomDepartamento = dpto.FirstOrDefault().NomDepartamento,
                                                    Total = (from codigos in codigosCasasJusticia join entidades in entidadesPorCasasJusticia on codigos equals entidades.IdCasaJusticia where entidades.IdDepartamento.Equals(dpto.FirstOrDefault().IdDepartamento) select entidades.IdCasaJusticia).Distinct().Count()
                                                };

                return Utilidades.ConsultaToDataTable<CjDepartamento>(queryCasasJusticiaPorDpto.ToArray());
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        #endregion
    }
}
